// 'use strict';

const cp = require('child_process')
const path = require('path')
const log = require('@renwang-0103/log')
const Package = require('@renwang-0103/package')

const SETTINGS = {
  init: '@imooc-cli/init',
}
async function exec() {
  // 使用arguments获取参数

  const argu = arguments[arguments.length - 1]
  const cmdName = argu.name()
  // console.log(argu, 'arguments', cmdName);
  let storePath = ''
  let pkg = ''
  const CACHE_DIR = 'dependencies'
  const packageName = SETTINGS[cmdName]
  const packageVersion = 'latest'
  let targetPath = process.env.CLI_TARGET_PATH
  const homePath = process.env.CLI_HOME_PATH
  log.verbose('路径', targetPath, homePath)

  if (!targetPath) {
    targetPath = path.resolve(homePath, CACHE_DIR)
    storePath = path.resolve(targetPath, 'node_modules')
    console.log(targetPath, storePath, '我的两个路径')
    pkg = new Package({
      targetPath,
      storePath,
      packageName,
      packageVersion,
    })

    const aa = await pkg.isExit()

    if (await pkg.isExit()) {
      // 更新package
      console.log('我要开始更新了')
      await pkg.update()
    } else {
      // 安装package
      await pkg.install()
    }
  } else {
    // 当客户端命令写了targetPath的时候
    pkg = new Package({
      targetPath,
      packageName,
      packageVersion,
    })
  }

  // console.log(await pkg.isExit(), 'await pkg.isExit()');

  // 不管tartgetPath有没有，都走下面的逻辑
  const rootFile = pkg.getRootFilePath()
  // console.log(rootFile, 'rootFile', Array.from(arguments).length)
  // Array.from(arguments).forEach(item => {
  //   console.log(item, 'item');
  // })
  if (rootFile) {
    // 在当前进程中使用，不能充分利用cpu资源
    // arguments 这里是一个类数组，用Array.from()  把类数组转变成数组
    // require(rootFile).apply(null, Array.from(arguments))
    try {
      // require(rootFile)(Array.from(arguments))
      const args = Array.from(arguments)
      const cmds = args[args.length - 1]
      
      const obj = Object.create(null)
      Object.keys(cmds).forEach((item) => {
        // hasOwnProperty判断是否是自有都属性，如果是原型链上都，就不要了
        // 下划线开头都也不要了
        // item是parent都不要了

        if (cmds.hasOwnProperty(item) && !item.startsWith('_')
          && item !== 'parent'
        ) {
          obj[item] = cmds[item]
        }
      })
      // console.log(obj, 'obj');
      args[args.length - 1] = obj
      // console.log(args, '我都命令')
      const code = `require('${rootFile}').call(null, ${JSON.stringify(args)})`
      // const code = 'console.log(1)'
      const child = cp.spawn('node', ['-e', code], {
        cwd: process.cwd(),
        stdio: 'inherit',
      })
      child.on('error', (e) => {
        console.log(e, '错误信息')
        process.exit(1)
      })
      child.on('exit', (e) => {
        console.log(e, ':我执行成功退出了')
        process.exit(e)
      })
    } catch (e) {
      console.log(e.message, '捕获错误')
    }
    // 改造， 在node的子进程中调用
  }

  // console.log(pkg.getRootFilePath(), 'getRootFilePath');
  // console.log(process.env.CLI_TARGET_PATH, '我的环境变量', pkg);
  return 'Hello from exec'
}
module.exports = exec
